package ar.pegasus.clasificador.boss;

import java.awt.Color;
import java.awt.Component;
import java.awt.Font;

import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;

import ar.pegasus.clasificador.gui.SkinClasicoClasificador;
import ar.pegasus.clasificador.gui.SkinModernoClasificador;
import ar.pegasus.clasificador.gui.SkinRojoClasificador;
import ar.pegasus.framework.boss.BossEstilos;
import ar.pegasus.framework.componentes.PException;
import ar.pegasus.framework.templates.main.skin.AbstractSkin;
import ar.pegasus.framework.templates.main.skin.ISkinDecorator;
import ar.pegasus.framework.util.ImageUtil;
import ar.pegasus.framework.util.IndexItem;
import ar.pegasus.framework.util.MiscUtil;

/**
 * Clase encargada de proveer los nombres de iconos como así también colores
 * y tipografías por default.
 * @author oarias
 */
public class BossEstilosClasificador {

	private static AbstractSkin defaultSkin;
	private static ISkinDecorator skinDecorator;
	protected static final AbstractSkin[] SKINS = new AbstractSkin[] { new SkinClasicoClasificador(), new SkinModernoClasificador(), new SkinRojoClasificador() };
	public static final String ICONO_ORGANIZACION = "ar/pegasus/clasificador/imagenes/porganizacion.png";
	public static final String ICONO_COLECCION = "ar/pegasus/clasificador/imagenes/pcoleccion.png";
	public static final String ICONO_MEDIO = "ar/pegasus/framework/imagenes/pmedio.png";
	public static final String ICONO_PRODUCTO = "ar/pegasus/framework/imagenes/pproducto.png";
	public static final String ICONO_SECCION = "ar/pegasus/framework/imagenes/pseccion.png";
	public static final String ICONO_SUBSECCION = "ar/pegasus/framework/imagenes/psubseccion.png";
	public static final Color COLOR_ESTADO_CELESTE = new Color(220, 226, 229);
	public static final Color COLOR_ESTADO_NARANJA = new Color(236, 218, 199);
	public static final Color COLOR_ESTADO_VERDE = new Color(198, 213, 185);
	public static final Color COLOR_ESTADO_AMARILLO = new Color(242, 240, 216);
	public static final Color COLOR_ESTADO_ROJO = new Color(246, 183, 160);
	public static final Color COLOR_ESTADO_GRIS = new Color(221, 222, 211);
	public static final Color COLOR_ESTADO_TURQUESA = new Color(205, 226, 225);
	public static final Color COLOR_ESTADO_BLANCO = new Color(255, 255, 255);
	public static final Color COLOR_AZUL = new Color(198, 233, 247); //Azul
	public static final Color COLOR_VIOLETA = new Color(234,211,235);
	/**
	 * Inicializa el BossEstilosADC. 
	 * @throws PException 
	 */
	public static void init() throws PException {
		skinDecorator = defaultSkin.getDecorator();
		//Setea el BossEstilos
	    BossEstilos.setSkins(SKINS);
		BossEstilos.setDefaultFont(skinDecorator.getDefaultFont());
		BossEstilos.setSecondaryFont(skinDecorator.getSecondaryFont());
	    if(MiscUtil.isMacOS()) {
	    	BossEstilos.ajustarFuenteComponentes();
	    }
		defaultSkin.init();
	}

	public static AbstractSkin getDefaultSkin() {
		return defaultSkin;
	}

	public static void setDefaultSkin(AbstractSkin defaultSkin) {
		BossEstilosClasificador.defaultSkin = defaultSkin;
		BossEstilos.setDefaultSkin(BossEstilosClasificador.defaultSkin);
	}

	public static void setDefaultSkin(String defaultSkin) throws PException {
		try {
			BossEstilosClasificador.defaultSkin = (AbstractSkin)Class.forName(defaultSkin).getConstructor(new Class[0]).newInstance(new Object[0]);
		} catch (ClassNotFoundException e) {
			BossEstilosClasificador.setDefaultSkin(new SkinRojoClasificador());
			return ;
		} catch(Exception e) {
			throw new PException("No se pudo instanciar el skin '" + defaultSkin + "' a partir de la configuración del cliente", e);
		}
		try {
			BossEstilos.setDefaultSkin(BossEstilosClasificador.defaultSkin);
		} catch(Exception e) {
			throw new PException("No se pudo instanciar el skin '" + defaultSkin + "' a partir de la configuración del cliente", e);
		}
	}

	public static Font getDefaultFont() {
		return skinDecorator.getDefaultFont();
	}

	public static Font getSecondaryFont() {
		return skinDecorator.getSecondaryFont();
	}

	public static String getIconoVentana() {
		return skinDecorator.getIconoVentana();
	}

	public static String getIconoLogin() {
		return skinDecorator.getIconoLogin();
	}

	public static Color getColorBarraTituloVentana() {
		return skinDecorator.getColorBarraTituloVentana();
	}

	public static Color getColorFondoVentana() {
		return skinDecorator.getColorFondoVentana();
	}

	public static Color getColorFondoPanel() {
		return skinDecorator.getColorFondoPanel();
	}

	public static Color getColorComponenteNormal() {
		return skinDecorator.getColorComponenteNormal();
	}

	public static Color getColorComponenteRollover() {
		return skinDecorator.getColorComponenteRollover();
	}

	public static Color getColorComponenteDeshabilitado() {
		return skinDecorator.getColorComponenteDeshabilitado();
	}

	public static Color getColorComponenteSeleccionado() {
		return skinDecorator.getColorComponenteSeleccionado();
	}

	public static Color getColorHeaderTabla() {
		return skinDecorator.getColorHeaderTabla();
	}

	public static Color getColorItemNormal() {
		return skinDecorator.getColorItemNormal();
	}

	public static Color getColorItemResaltado() {
		return skinDecorator.getColorItemResaltado();
	}

	public static Color getColorCajaTexto() {
		return skinDecorator.getColorCajaTexto();
	}

	/**
	 * Clase renderer del árbol de productos.
	 * El primer nivel del árbol (nivel 0) corresponde al Medio; el segundo nivel
	 * (nivel 1) corresponde al Producto; el tercer nivel (nivel 2) corresponde
	 * a la Sección y el cuarto nivel (nivel 3) corresponde a la Subsección.
	 */
	public static class ArbolProductosRenderer extends DefaultTreeCellRenderer {
		private static final long serialVersionUID = 1L;
		
		private Color colorResaltado;

		public ArbolProductosRenderer() {
			super();
		}

		public ArbolProductosRenderer(Color colorItemResaltado) {
			super();
			this.colorResaltado = colorItemResaltado;
		}
		public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) {
			super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus);
			DefaultMutableTreeNode node = (DefaultMutableTreeNode)value;
			Color colorItemResaltado = defaultSkin.getDecorator() == null ? Color.BLACK : defaultSkin.getDecorator().getColorItemResaltado();
			switch(node.getLevel()) {
				case 0: //Organizacion
					setIcon(ImageUtil.loadIcon(ICONO_ORGANIZACION));
					setDisabledIcon(ImageUtil.loadIcon(ICONO_ORGANIZACION));
					break;

				case 1: //Coleccion
					setIcon(ImageUtil.loadIcon(ICONO_COLECCION));
					setDisabledIcon(ImageUtil.loadIcon(ICONO_COLECCION));
					break;

				case 2: //Medio
					setIcon(ImageUtil.loadIcon(ICONO_MEDIO));
					setDisabledIcon(ImageUtil.loadIcon(ICONO_MEDIO));
					break;

				case 3: //Producto
					setIcon(ImageUtil.loadIcon(ICONO_PRODUCTO));
					setDisabledIcon(ImageUtil.loadIcon(ICONO_PRODUCTO));
					//Muestra el nodo de otro color si tiene datos heredados
					if(((IndexItem)node.getUserObject()).isDistinguido() && !sel) {
						setForeground(colorResaltado == null ? colorItemResaltado : colorResaltado);
					}

				break;

				case 4: //Secci�n
					setIcon(ImageUtil.loadIcon(ICONO_SECCION));
					setDisabledIcon(ImageUtil.loadIcon(ICONO_SECCION));
					if(((IndexItem)node.getUserObject()).isDistinguido() && !sel) {
						setForeground(colorResaltado == null ? colorItemResaltado : colorResaltado);
					}
					break;

				case 5: //Subsecci�n
					setIcon(ImageUtil.loadIcon(ICONO_SUBSECCION));
					setDisabledIcon(ImageUtil.loadIcon(ICONO_SUBSECCION));
					if(((IndexItem)node.getUserObject()).isDistinguido() && !sel) {
						setForeground(colorResaltado == null ? colorItemResaltado : colorResaltado);
					}
					break;
			}
			return this;
		}
	}


}

